package tec ;
import java.util.*;


class Autobus implements Bus, Transport
{

    public static boolean barre;
    private JaugeNaturel jaugeAssis;
    private JaugeNaturel jaugeDebout;
    private  HashSet<Passager> passagers;
    private int nbPassagers ;
    public int numeroArret ;
	
    protected Autobus(int nbPlaceAssise, int nbPlaceDebout)
    {   if(nbPlaceAssise <0 || nbPlaceDebout <0)
	    throw new IllegalArgumentException("Les nombres de place doivent etre positif");

	if(barre == false){
	    jaugeAssis = new JaugeNaturel(0,nbPlaceAssise,0);
	    jaugeDebout = new JaugeNaturel(0, nbPlaceDebout,0);
	}
	
	else{
	jaugeAssis  = new JaugeNaturelBarre(0, nbPlaceAssise, 0,true);
	jaugeDebout = new JaugeNaturelBarre(0, nbPlaceDebout, 0,false);
	}
        nbPassagers = 0;
        passagers = new HashSet<Passager>(nbPlaceAssise + nbPlaceDebout);
    }

	public void allerArretSuivant() throws TecInvalidException,IllegalStateException{
	    numeroArret++;
	    final Iterator<Passager> it= passagers.iterator();
	    Bus b = new Bus() {   
		    Iterator<Passager> ti=it;
		    public void allerArretSuivant() throws TecInvalidException{}
		    public boolean aPlaceAssise(){return Autobus.this.aPlaceAssise();}
		    public boolean aPlaceDebout(){return Autobus.this.aPlaceDebout();}
		    public void demanderChangerEnAssis(Passager p) throws IllegalStateException  {Autobus.this.demanderChangerEnAssis(p);} 
		    public void demanderChangerEnDebout(Passager p) throws IllegalStateException 
		    { 	
			Autobus.this.demanderChangerEnDebout(p); 
		    }
		    
		    public void demanderPlaceAssise(Passager p){Autobus.this.demanderPlaceAssise(p);}
		    public void demanderPlaceDebout(Passager p){Autobus.this.demanderPlaceDebout(p);}
		    public void demanderSortie(Iterator<Passager> index,Passager p)
		    {
			Autobus.this.demanderSortie(p);
			index.remove();
		    }

		    public void demanderSortie(Passager p){
			demanderSortie(ti,p);
		    }
		};

	    
	    PassagerAbstrait pa=null;
	    
	    for(;it.hasNext();)
		{
		    pa = (PassagerAbstrait) it.next();
		    if(pa.getDestination()-numeroArret<0)
			throw new IllegalStateException();
		    pa.nouvelArret(b,numeroArret);	
		}
	}
    public void demanderSortie(Passager p)
    {
	if(p.estDebout())
	    jaugeDebout.decrementer();
	else if (p.estAssis())
	    jaugeAssis.decrementer();
	
	p.accepterSortie();
    }
    
    public boolean aPlaceAssise()
    {
	return (!jaugeAssis.estRouge()); 
    }
    
    
    public boolean aPlaceDebout()
    {
	return (!jaugeDebout.estRouge());
    }	    
    
    public void demanderChangerEnAssis(Passager p) throws IllegalStateException  { 
	if(p.estAssis())
	    throw new IllegalStateException();
	p.accepterPlaceAssise();
	jaugeAssis.incrementer();
	jaugeDebout.decrementer();
    }
    
    public void demanderChangerEnDebout(Passager p) throws IllegalStateException 
    { 	
	if (p.estDebout())
	    throw new IllegalStateException();
	p.accepterPlaceDebout();
	jaugeAssis.decrementer();
	jaugeDebout.incrementer();
        
    }
    
    public void demanderPlaceAssise(Passager p)
    {
	
	p.accepterPlaceAssise();
	boolean i = passagers.add(p);
	if(i==false)
	    System.err.println("Passager not add");
	else{
	    nbPassagers++;
	    jaugeAssis.incrementer();
	}
	
    } 
    
    public void demanderPlaceDebout(Passager p)
    {
	
	p.accepterPlaceDebout();
	boolean i = passagers.add(p);
	if(i==false)
	    System.err.println("Passager not add");
	else{
	    nbPassagers++;
	    jaugeDebout.incrementer();
	}
    }
    
        
    
    public String toString() {
	return "[arret:"+ numeroArret + ", assis:" + jaugeAssis +
	    ", debout:" + jaugeDebout + "]";
    }
    
    
    
}
